package com.zhongshan.ga.mobile.logic;

import org.apache.ibatis.session.SqlSession;
import org.restlet.representation.Representation;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.zhongshan.ga.commonvar.ArgsConfig;
import com.zhongshan.ga.commonvar.CommendConfig;
import com.zhongshan.ga.logger.GenerateLog;
import com.zhongshan.ga.mobile.tools.JsonResultUtils;
import com.zhongshan.ga.mobile.tools.UserInfoMap;
import com.zhongshan.ga.mobile.tools.UserInfosBean;
import com.zhongshan.ga.mybatis.bean.PeopleInfoBean;
import com.zhongshan.ga.mybatis.dao.IPeopleInfoDao;
import com.zhongshan.ga.utils.MyBatisUtil;

/**
 * 用户信息处理逻辑类
 * 
 * @author kakaxi
 * 
 */
public class PeopleInfoLogic extends ParentLogic {

	/**
	 * 用户信息数据库访问接口
	 */
	private IPeopleInfoDao peopleInfoDao;

	/**
	 * 用户登陆逻辑处理
	 * 
	 * @param representation
	 * @return
	 */
	public JsonObject login(Representation representation) {
		SqlSession session = MyBatisUtil.getSqlSession(true);
		peopleInfoDao = session.getMapper(IPeopleInfoDao.class);

		JsonObject resultJson = new JsonObject();
		try {
			JsonObject acceptJson = getJsonFromRequest(representation);
			// 检查操作码是否匹配
			resultJson = basicCheck(acceptJson, CommendConfig.USER_LOGIN, false);

			if (resultJson.get(ArgsConfig.RESULT_CODE).getAsString()
					.equals(ArgsConfig.RESPONSE_SUCCESS)) {
				// 取出json请求中的data请求数据
				if (acceptJson.get(ArgsConfig.REQUEST_DATA) != null) {
					JsonObject dataJson = acceptJson.get(
							ArgsConfig.REQUEST_DATA).getAsJsonObject();
					PeopleInfoBean requestInfo = new Gson().fromJson(dataJson,
							PeopleInfoBean.class);

					// 检查是否已存在用户信息
					PeopleInfoBean resultInfo = checkExistPeopleInfo(requestInfo);
					if (resultInfo == null) {
						// 当不存在时就会进行自动注册, 创建用户系统编码并把数据添加到数据库中
						resultInfo = addInfoToReg(requestInfo);
						if (resultInfo == null) {
							GenerateLog
									.outDebug("*************login 注册失败****************************");
							return JsonResultUtils.createResultJson(
									CommendConfig.USER_LOGIN, "注册失败", false);
						}
						GenerateLog
								.outDebug("*************login 注册成功****************************");
					}

					// 当数据库已存在此信息时, 自动生成token 并完成登录
					String token = doLogin(acceptJson, resultInfo);
					// 检查token以及登陆信息的生成情况
					if (token != null) {
						GenerateLog
								.outDebug("*************login 登陆成功****************************");
						resultJson.addProperty(ArgsConfig.TOKEN, token);
					} else {
						GenerateLog
								.outDebug("*************login token不存在,请重新登陆****************************");
						resultJson = JsonResultUtils.createResultJson(
								CommendConfig.USER_LOGIN, "请重新登陆", false);
					}

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
			GenerateLog
					.outDebug("*************login 请求数据取出出错****************************");
			resultJson = JsonResultUtils.createResultJson(
					CommendConfig.USER_LOGIN, "请求数据出错", false);
		} finally {
			session.close();
		}

		GenerateLog
				.outDebug("*************login 逻辑处理结果****************************");
		GenerateLog.outDebug(resultJson.toString());

		return resultJson;
	}

	/**
	 * 检查用户信息请求
	 * 
	 * @param requestInfo
	 *            请求里的用户信息数据类
	 */
	private PeopleInfoBean checkExistPeopleInfo(PeopleInfoBean requestInfo) {
		PeopleInfoBean peopleInfo = null;
		String account = null;

		// QQ账号查询
		account = requestInfo.getQQ();
		if (account != null && !account.trim().equals("")) {
			peopleInfo = peopleInfoDao.getPeopleInfoByQQ(account.trim());
			if (peopleInfo != null) {
				return peopleInfo;
			}
		}

		// 微信账号查询
		account = requestInfo.getWeChat();
		if (account != null && !account.trim().equals("")) {
			peopleInfo = peopleInfoDao.getPeopleInfoByWechat(account.trim());
			if (peopleInfo != null) {
				return peopleInfo;
			}
		}

		// 微博账号查询
		account = requestInfo.getWeibo();
		if (account != null && !account.trim().equals("")) {
			peopleInfo = peopleInfoDao.getPeopleInfoByWeibo(account.trim());
			if (peopleInfo != null) {
				return peopleInfo;
			}
		}

		return null;
	}

	/**
	 * 添加新的用户信息 完成注册
	 * 
	 * @param newInfo
	 *            新的用户信息
	 */
	private PeopleInfoBean addInfoToReg(PeopleInfoBean newInfo) {
		String peopleSystemCode = System.currentTimeMillis() + "";
		newInfo.setPeopleSystemCode(peopleSystemCode);
		int result = peopleInfoDao.addPeopleInfo(newInfo);
		if (result != 0) {
			return newInfo;
		} else {
			return null;
		}
	}

	/**
	 * 做登陆操作, 生成token和用户信息
	 * 
	 * @param acceptJson
	 *            json请求数据
	 * @param resultInfo
	 *            注册或者从数据库中取出的 结果用户信息
	 * @return
	 */
	private String doLogin(JsonObject acceptJson, PeopleInfoBean resultInfo) {
		String token = null;
		UserInfosBean userInfosBean = null;

		if (acceptJson.get(ArgsConfig.TOKEN) != null) {
			// 处理用户已经登陆过的
			token = acceptJson.get(ArgsConfig.TOKEN).getAsString();
			// 处理 token已经存在,但缓存中没有用户登陆信息
			if (UserInfoMap.getUserInfos(token) != null) {
				GenerateLog
						.outDebug("*************login token存在,用户登陸信息也存在****************************");
				return token;
			} else {
				GenerateLog
						.outDebug("*************login token存在,用户登陸信息不存在****************************");
				return null;
			}
		} else {
			// 当不存在token时, 生成token和用户登陆信息
			userInfosBean = new UserInfosBean();
			userInfosBean.setPeopleSystemCode(resultInfo.getPeopleSystemCode());
			userInfosBean.setFlag(judgeLoginType(resultInfo));
			userInfosBean.setFansTime(10 * 60 * 3600); // 10小时
			userInfosBean.setmD5String("");
			userInfosBean.setPassword("");
			token = System.currentTimeMillis() + "_"
					+ (int) (Math.random() * 9999 + 1000);
			// 保存到缓存中, 并返回token
			boolean result = UserInfoMap.setUserInfos(token, userInfosBean);
			if (result) {
				GenerateLog
						.outDebug("*************login 用户登陸信息生成成功****************************");
				return token;
			} else {
				GenerateLog
						.outDebug("*************login 用户登陸信息生成失败****************************");
				return null;
			}
		}
	}

	/**
	 * 判断登录的类型 1.微信 2.QQ 3.微博
	 * 
	 * @param peopleInfo
	 *            用户信息类
	 * @return
	 */
	private int judgeLoginType(PeopleInfoBean peopleInfo) {
		if (peopleInfo.getWeChat() != null
				&& !peopleInfo.getWeChat().trim().equals("")) {
			return 1;
		}
		if (peopleInfo.getQQ() != null && !peopleInfo.getQQ().trim().equals("")) {
			return 2;
		}
		if (peopleInfo.getWeibo() != null
				&& !peopleInfo.getWeibo().trim().equals("")) {
			return 3;
		}
		return -1;
	}

}
